package es.tikitaka.domain.jugador;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.validator.Max;
import org.hibernate.validator.Min;

import es.tikitaka.dictionary.PosicionDic;
import es.tikitaka.domain.Sancion;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.Titulo;
import es.tikitaka.domain.equipo.PartEquipo;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Entity
@Table(name = "PARTJUGADOR")
public class PartJugador implements Comparable<Object> {

	private Integer id;
	private Jugador jugador;
	private Temporada temporada;
	private PartEquipo equipo;
	private Set<SegJugador> m_seguimientos;
	private int edad;
	private double altura;
	private double peso;
	private PosicionDic posicion;
	private int dorsal;
	private EstJugador estadisticas;
	private Set<Sancion> m_sanciones;
	private Set<FotoJugador> m_fotos;
	private boolean sancionado;
	private boolean lesionado;
	private Titulo titulo;

	/**
	 * Constructor por defecto
	 */
	public PartJugador() {
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return id Id de la participación del jugador
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PJ_GEN")
	@SequenceGenerator(allocationSize = 1, name = "PJ_GEN", sequenceName = "PJ_SEQ")
	@Column(name = "X_PJ", nullable = false, precision = 10, scale = 0)
	public Integer getId() {
		return id;
	}

	/**
	 * 
	 * @param id
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * 
	 * @return jugador Jugador al que pertenece la participación
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "JUGADOR")
	public Jugador getJugador() {
		return jugador;
	}

	/**
	 * 
	 * @param jugador
	 */
	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}

	/**
	 * 
	 * @return temporada Temporada en la que participa el jugador
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "TEMPORADA")
	public Temporada getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return equipo Equipo con el que participa en el campeonato
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "EQUIPO")
	public PartEquipo getEquipo() {
		return equipo;
	}

	/**
	 * 
	 * @param equipo
	 */
	public void setEquipo(PartEquipo equipo) {
		this.equipo = equipo;
	}

	/**
	 * 
	 * @return m_seguimientos Conjunto de seguimientos para los partidos
	 */
	@OneToMany(mappedBy = "partJugador", fetch = FetchType.LAZY)
	public Set<SegJugador> getM_seguimientos() {
		return m_seguimientos;
	}

	/**
	 * 
	 * @param m_seguimientos
	 */
	public void setM_seguimientos(Set<SegJugador> m_seguimientos) {
		this.m_seguimientos = m_seguimientos;
	}

	/**
	 * 
	 * @return edad Edad del jugador en esta participación
	 */
	@Column(name = "EDAD")
	public int getEdad() {
		return edad;
	}

	/**
	 * 
	 * @param edad
	 */
	public void setEdad(int edad) {
		this.edad = edad;
	}

	/**
	 * 
	 * @return altura del jugador en esta participación
	 */
	@Column(name = "ALTURA")
	public double getAltura() {
		return altura;
	}

	/**
	 * 
	 * @param altura
	 */
	public void setAltura(double altura) {
		this.altura = altura;
	}

	/**
	 * 
	 * @return peso Peso del jugador en esta participación
	 */
	@Column(name = "PESO")
	public double getPeso() {
		return peso;
	}

	/**
	 * 
	 * @param peso
	 */
	public void setPeso(double peso) {
		this.peso = peso;
	}

	/**
	 * 
	 * @return posicion PosicionDic del jugador en esta participación
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "POSICION")
	public PosicionDic getPosicion() {
		return posicion;
	}

	/**
	 * 
	 * @param posicion
	 */
	public void setPosicion(PosicionDic posicion) {
		this.posicion = posicion;
	}

	/**
	 * 
	 * @return
	 */
	@Column(name = "DORSAL")
	@Min(value = 0, message = "El valor del dorsal no puede ser menor que 0")
	@Max(value = 99, message = "El valor del dorsal no puede ser mayor que 99")
	public int getDorsal() {
		return dorsal;
	}

	/**
	 * 
	 * @param dorsal
	 */
	public void setDorsal(int dorsal) {
		this.dorsal = dorsal;
	}

	/**
	 * 
	 * @return estadisticas Estadísticas para la participación del jugador en la
	 *         temporada
	 */
	@OneToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE,
			CascadeType.PERSIST })
	@JoinColumn(name = "ESTADISTICAS")
	public EstJugador getEstadisticas() {
		return estadisticas;
	}

	/**
	 * 
	 * @param estadisticas
	 */
	public void setEstadisticas(EstJugador estadisticas) {
		this.estadisticas = estadisticas;
	}

	/**
	 * 
	 * @return m_sanciones Conjunto de sanciones pertenecientes a la
	 *         participación del jugador en el campeonato
	 */
	@OneToMany(mappedBy = "jugador", fetch = FetchType.LAZY)
	public Set<Sancion> getM_sanciones() {
		return m_sanciones;
	}

	/**
	 * 
	 * @param m_sanciones
	 */
	public void setM_sanciones(Set<Sancion> m_sanciones) {
		this.m_sanciones = m_sanciones;
	}

	/**
	 * 
	 * @return m_fotos Conjunto de fotos del jugador en el campeonato
	 */
	@OneToMany(mappedBy = "jugador", fetch = FetchType.LAZY)
	public Set<FotoJugador> getM_fotos() {
		return m_fotos;
	}

	/**
	 * 
	 * @param m_fotos
	 */
	public void setM_fotos(Set<FotoJugador> m_fotos) {
		this.m_fotos = m_fotos;
	}

	/**
	 * 
	 * @return sancionado True o false dependiendo de si el jugador tiene
	 *         pendiente de cumplir alguna sanción o no
	 */
	@Column(name = "SANCIONADO")
	public boolean isSancionado() {
		return sancionado;
	}

	/**
	 * 
	 * @param sancionado
	 */
	public void setSancionado(boolean sancionado) {
		this.sancionado = sancionado;
	}

	/**
	 * 
	 * @return lesionado True o false dependiendo de si el jugador está
	 *         lesionado o no
	 */
	@Column(name = "LESIONADO")
	public boolean isLesionado() {
		return lesionado;
	}

	/**
	 * 
	 * @param lesionado
	 */
	public void setLesionado(boolean lesionado) {
		this.lesionado = lesionado;
	}

	/**
	 * 
	 * @return
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "TITULO")
	public Titulo getTitulo() {
		return titulo;
	}
	
	/**
	 * 
	 * @param titulo
	 */
	public void setTitulo(Titulo titulo) {
		this.titulo = titulo;
	}
	
	/**
	 * Método equals
	 */
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof PartJugador)) {
			return false;
		}
		if (obj != null) {
			if (this.id == ((PartJugador) obj).getId()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Método hashCode
	 */
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}

	/**
	 * Método compareTo
	 */
	public int compareTo(Object o) {
		PartJugador j = (PartJugador) o;
		if (this.temporada.getAnio().getAnio() < j.getTemporada().getAnio()
				.getAnio()) {
			return -1;
		} else if (this.temporada.getAnio().getAnio() == j.getTemporada()
				.getAnio().getAnio()) {
			return 0;
		} else {
			return 1;
		}
	}
}
